﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlServerCe;

namespace EWS
{
    public partial class frmAddPatient : Form
    {
        public frmAddPatient()
        {
            InitializeComponent();
            RefreshHandylist();
        }




        static bool IsValidAlphaNumericString(string strAlphanum)
        {
            System.Text.RegularExpressions.Regex pattern = new System.Text.RegularExpressions.Regex(@"^[A-Za-z0-9ÜüÖöÄäß]+$");
            return pattern.IsMatch(strAlphanum.Trim());
        }

        private void txtName_TextChanged(object sender, EventArgs e)
        {
            if (txtName.Text == "")
                // Keine Eingabe
                txtName.BackColor = Color.White;
            else
                // Eingabe vorhanden
                if (IsValidAlphaNumericString(txtName.Text) == true)
                {
                    // Eingabe valide
                    txtName.BackColor = Color.FromArgb(231, 246, 231);
                }
                else
                {
                    // Eingabe nicht valide
                    txtName.BackColor = Color.FromArgb(246, 238, 238);
                    toolTip1.ToolTipTitle = "Achtung";
                    toolTip1.Show("Sie haben unzulässige Zeichen eingegeben! Erlaubte Zeichen A-Z, a-z, 0-9, Üü, Öö, Ää, ß.", txtName);

                }
            CheckAllInputs();
        }

        private void txtVorname_TextChanged(object sender, EventArgs e)
        {
            if (txtVorname.Text == "")
                // Keine Eingabe
                txtVorname.BackColor = Color.White;
            else
                // Eingabe vorhanden
                if (IsValidAlphaNumericString(txtVorname.Text) == true)
                {
                    // Eingabe valide
                    txtVorname.BackColor = Color.FromArgb(231, 246, 231);
                }
                else
                {
                    // Eingabe nicht valide
                    txtVorname.BackColor = Color.FromArgb(246, 238, 238);
                    toolTip1.ToolTipTitle = "Achtung";
                    toolTip1.Show("Sie haben unzulässige Zeichen eingegeben! Erlaubte Zeichen A-Z, a-z, 0-9, Üü, Öö, Ää, ß.", txtVorname);

                }
            CheckAllInputs();
        }

        // Checkt ob alle Eingabe valide sind
        private void CheckAllInputs()
        {
            if (txtVorname.Text != "" && IsValidAlphaNumericString(txtVorname.Text) == true)
            {
                if (txtName.Text != "" && IsValidAlphaNumericString(txtName.Text) == true)
                {
                    if ((listView1.SelectedItems.Count != 0) && (listView1.SelectedItems[0].Group.Header != "In Benutzung"))
                    {

                        btnAdd.Enabled = true;
                        return;
                    }
                }


            }
            btnAdd.Enabled = false;
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            this.Close();
        }



        void RefreshHandylist(){
            // Verbinndung aufbauen
            SqlCeConnection conn = new SqlCeConnection(Properties.Settings.Default.EWS_DatabaseConnectionString);
            conn.Open();

            //######################################################## Noch nicht zugeprdnete Handynummern auflisten
            // Commando aufbauen
            SqlCeCommand cmd = conn.CreateCommand();
            cmd.CommandText = @"SELECT Handynummer, MAX(""fkPaID"") as fkPaID FROM PatientData WHERE fkPaID = @id GROUP BY Handynummer";
            cmd.Parameters.AddWithValue("@id", "1");


            // Commando ausführen
            cmd.ExecuteScalar();
            SqlCeDataReader reader = cmd.ExecuteReader();

            // ListView initalisieren: Gruppen definieren
            System.Windows.Forms.ListViewGroup listViewGroup1 = new System.Windows.Forms.ListViewGroup("Verfügbar", System.Windows.Forms.HorizontalAlignment.Left);
            System.Windows.Forms.ListViewGroup listViewGroup2 = new System.Windows.Forms.ListViewGroup("In Benutzung", System.Windows.Forms.HorizontalAlignment.Left);
            this.listView1.Groups.AddRange(new System.Windows.Forms.ListViewGroup[] { listViewGroup1, listViewGroup2 });

            // In ListView einfügen
            while (reader.Read()) {
                System.Windows.Forms.ListViewItem listViewItem1 = new System.Windows.Forms.ListViewItem(new string[] {"","",reader.GetString(0),""}, -1);
                listViewItem1.Group = listViewGroup1;
                this.listView1.Items.AddRange(new System.Windows.Forms.ListViewItem[] {listViewItem1});
            }

            //######################################################## Schon zugeprdnete Handynummern auflisten
            // Commando aufbauen
            cmd = conn.CreateCommand();
            cmd.CommandText = @"SELECT fkPaID, MAX(""Handynummer"") as Handynummer FROM PatientData WHERE fkPaID != @id GROUP BY fkPaID";
            cmd.Parameters.AddWithValue("@id", "1");
            //SELECT "Spalten_Name1", SUM("Spalten_Name2") FROM "Tabellen_Name" GROUP BY "Spalten_Name1"

            // Commando ausführen
            cmd.ExecuteScalar();
            reader = cmd.ExecuteReader();

            // In ListView einfügen
            while (reader.Read())
            {
                cmd = conn.CreateCommand();
                cmd.CommandText = @"SELECT * FROM Patient WHERE PaID=@paid AND DeleteFlag=0";
                int oi = reader.GetInt32(0);
                cmd.Parameters.AddWithValue("@paid", oi);

                cmd.ExecuteScalar();
                SqlCeDataReader reader2 = cmd.ExecuteReader();

                if (reader2.Read() != false)
                {
                    System.Windows.Forms.ListViewItem listViewItem1 = new System.Windows.Forms.ListViewItem(new string[] { "", "", reader.GetString(1), reader2.GetString(1) + ", " + reader2.GetString(2) }, -1);
                    listViewItem1.Group = listViewGroup2;
                    this.listView1.Items.AddRange(new System.Windows.Forms.ListViewItem[] { listViewItem1 });
                }
            }
            // Verbinndung schließen
            conn.Close();
        }

        private void listView1_SelectedIndexChanged(object sender, EventArgs e)
        {
            CheckAllInputs();
        }


        void InsertPatientName()
        {
            // Verbinndung aufbauen
            SqlCeConnection conn = new SqlCeConnection(Properties.Settings.Default.EWS_DatabaseConnectionString);
            conn.Open();

            // Commando aufbauen
            SqlCeCommand cmd = conn.CreateCommand();
            //SqlCeTransaction myTrans;

            //myTrans = conn.BeginTransaction();
            cmd.Connection = conn;
            //cmd.Transaction = myTrans;

            cmd.CommandText = @"INSERT INTO Patient (Vorname,Nachname) VALUES (@vor,@nach)";
            cmd.Parameters.AddWithValue("@vor", txtVorname.Text);
            cmd.Parameters.AddWithValue("@nach", txtName.Text);

            //cmd.Prepare();
            int result = cmd.ExecuteNonQuery();
            //myTrans.Commit();

            conn.Close();
            
        }

        void UpdateMeasureData()
        {
            int sNewPatientID=0;

            //####################################################  Herausfinden der ID des neue angelegten Benutzers
            // Verbindung aufbauen
            SqlCeConnection conn = new SqlCeConnection(Properties.Settings.Default.EWS_DatabaseConnectionString);
            conn.Open();

            // Commando aufbauen
            SqlCeCommand cmd = conn.CreateCommand();
            cmd.CommandText = @"SELECT * FROM Patient WHERE vorname=@vor AND nachname=@nach";
            cmd.Parameters.AddWithValue("@vor", txtVorname.Text);
            cmd.Parameters.AddWithValue("@nach", txtName.Text);

            // Commando ausführen
            cmd.ExecuteScalar();
            SqlCeDataReader reader = cmd.ExecuteReader();

            // In Liste einfügen
            while (reader.Read())
            {
                sNewPatientID = reader.GetInt32(0);
            }
            //MessageBox.Show(sNewPatientID.ToString());

            //####################################################  Messdaten dieser neuen ID, des neue angelegten Benutzers, zuweisen
            cmd = conn.CreateCommand();
            cmd.Connection = conn;

            cmd.CommandText = @"UPDATE PatientData SET fkPaID=@new_patient_id WHERE Handynummer=@hnr AND fkPaID='1'";
            cmd.Parameters.AddWithValue("@new_patient_id", sNewPatientID);
            cmd.Parameters.AddWithValue("@hnr", listView1.SelectedItems[0].SubItems[2].Text);

            int result = cmd.ExecuteNonQuery();
            //MessageBox.Show(result.ToString());
            
            conn.Close();

        }




        private void btnAdd_Click(object sender, EventArgs e)
        {
            InsertPatientName();    // Neuen Patientnamen in DB eintragen.
            UpdateMeasureData();    // Allen Messdatensätze mit der ausgwählten Handynummer dem Patiente zuordnen.
            this.Close();           // Fertig! -> Schließen.
        }

        
     

    }
}
